#include "BaseElement.h"

namespace uml {

BaseElement::BaseElement()
    : JsonSerializable()
    , umlType_("") {}

BaseElement::BaseElement(const QString& umlType)
    : JsonSerializable()
    , umlType_(umlType) {}

BaseElement::BaseElement(const QString& umlType, const QString& id)
    : JsonSerializable()
    , umlType_(umlType)
    , id_(id) {}

void BaseElement::fromJson(const QJsonObject& json, QStringList& errorList) {
    umlType_ = json.value("_umlType").toString(umlType_);
    guiType_ = json.value("_guiType").toString(guiType_);
    id_ = QUuid(json.value("_id").toString());
    data_ = json.value("_data").toObject();
}

void BaseElement::toJson(QJsonObject& json) {
    json.insert("_umlType", umlType_);
    if (!guiType_.isEmpty()) {
        json.insert("_guiType", guiType_);
    }
    json.insert("_id", id_.toString());
    if (!data_.isEmpty()) {
        json.insert("_data", data_);
    }
}

QString BaseElement::umlType() const {
    return umlType_;
}

QString BaseElement::guiType() const {
    return guiType_;
}

void BaseElement::setGuiType(const QString& guiType) {
    guiType_ = guiType;
}

QUuid BaseElement::id() const {
    return id_;
}

void BaseElement::setId(const QUuid& value) {
    id_ = value;
}

QJsonObject& BaseElement::data() {
    return data_;
}

QVariant BaseElement::getDataVariant(const QString& key) const {
    return data_[key].toVariant();
}

QString BaseElement::getDataString(
    const QString& key,
    const QString& defaultValue
) const {
    return data_[key].toString(defaultValue);
}

int BaseElement::getDataInt(const QString& key, int defaultValue) const {
    return data_[key].toInt(defaultValue);
}

double BaseElement::getDataDouble(const QString& key, double defaultValue)
    const {
    return data_[key].toDouble(defaultValue);
}

bool BaseElement::getDataBool(const QString& key, bool defaultValue) const {
    return data_[key].toBool(defaultValue);
}

QJsonObject BaseElement::getDataObject(const QString& key) const {
    return data_[key].toObject();
}

QJsonArray BaseElement::getDataArray(const QString& key) const {
    return data_[key].toArray();
}

void BaseElement::setData(const QString& key, const QString& value) {
    data_.insert(key, value);
}

void BaseElement::setData(const QString& key, int value) {
    data_.insert(key, value);
}

void BaseElement::setData(const QString& key, double value) {
    data_.insert(key, value);
}

void BaseElement::setData(const QString& key, bool value) {
    data_.insert(key, value);
}

void BaseElement::setData(const QString& key, QJsonObject& value) {
    data_.insert(key, value);
}

void BaseElement::setData(const QString& key, QJsonArray& value) {
    data_.insert(key, value);
}

} // namespace uml
